package pl.wroc.pwr.mss.server.ui.buttons;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFileChooser;

import org.apache.log4j.Logger;

import pl.wroc.pwr.mss.logic.domain.Playlist;
import pl.wroc.pwr.mss.logic.domain.Song;
import pl.wroc.pwr.mss.server.service.SongService;
import pl.wroc.pwr.mss.server.ui.dialogs.JPlaylistEditDialog;
import pl.wroc.pwr.mss.server.ui.filechoosers.JMp3FileChooser;
import pl.wroc.pwr.mss.server.ui.tables.models.SongEditTableModel;

/**
 * Przycisk do dodawania nowych utworów do playlisty.
 * 
 * @author mjagus
 */
public class JAddSongsButton extends JButton implements ActionListener
{
    /**
     * Identyfikator klasy.
     */
    private static final long serialVersionUID = -9071509130125203278L;

    /**
     * Logger tej klasy.
     */
    private static final Logger log = Logger.getLogger(JAddSongsButton.class);

    /**
     * Okno dialogowe edycji playlisty na ktorym znajduje sie ten przycisk.
     */
    private JPlaylistEditDialog playlistEditDialog;

    /**
     * Okno dialogowe wyboru plikow mp3.
     */
    private JMp3FileChooser mp3FileChooser;

    /**
     * Serwis dla encji Song.
     */
    private SongService songService;

    /**
     * Iniciuje komponent.
     */
    public JAddSongsButton()
    {
        super("Add songs");
        super.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        log.info("Opening mp3 file chooser");
        int option = mp3FileChooser.showOpenDialog(playlistEditDialog);
        log.info("Closing mp3 file chooser");

        if(option == JFileChooser.APPROVE_OPTION)
        {
            log.info("Files have been selected");
            File[] files = mp3FileChooser.getSelectedFiles();

            List<Song> songs = songService.createSongsForFiles(files);

            Playlist playlist = playlistEditDialog.getSongEditTable().getPlaylist();
            int currentSize = playlist.getSongs().size();
            for(int i = 0; i < songs.size(); i++)
                songs.get(i).setPriority(currentSize + i);

            playlist.getSongs().addAll(songs);

            SongEditTableModel songEditTableModel = (SongEditTableModel)playlistEditDialog.getSongEditTable().getModel();
            songEditTableModel.fireTableDataChanged();
        }
    }

    /**
     * @return Okno dialogowe edycji playlisty na ktorym znajduje sie ten przycisk
     */
    public JPlaylistEditDialog getPlaylistEditDialog()
    {
        return playlistEditDialog;
    }

    /**
     * @return Okno dialogowe wyboru plikow mp3
     */
    public JMp3FileChooser getMp3FileChooser()
    {
        return mp3FileChooser;
    }

    /**
     * @return Serwis dla encji Song
     */
    public SongService getSongService()
    {
        return songService;
    }

    /**
     * @param playlistEditDialog Okno dialogowe edycji playlisty na ktorym
     * znajduje sie ten przycisk
     */
    public void setPlaylistEditDialog(JPlaylistEditDialog playlistEditDialog)
    {
        this.playlistEditDialog = playlistEditDialog;
    }

    /**
     * @param mp3FileChooser Okno dialogowe wyboru plikow mp3
     */
    public void setMp3FileChooser(JMp3FileChooser mp3FileChooser)
    {
        this.mp3FileChooser = mp3FileChooser;
    }

    /**
     * @param songService Serwis dla encji Song
     */
    public void setSongService(SongService songService)
    {
        this.songService = songService;
    }
}
